package com.sunlands.qdcy.deskmate.vo;

import lombok.Data;
import org.springframework.util.CollectionUtils;

import java.io.Serializable;
import java.util.Comparator;
import java.util.List;

/**
 * @author zl
 * @version 1.0
 * @date Created in 2020/4/14
 */
@Data
public class AppleVerifyReceiptResponse implements Serializable {

    private static final long serialVersionUID = -2273082156197427679L;

    private Integer status;

    private String environment;

    private ReceiptData receipt;



    @Data
    public static class ReceiptData {
        /**
         * 生成的收据类型。该值对应于购买应用程序或VPP的环境。
         * 可能值：Production、ProductionVPP、ProductionSandbox、ProductionVPPSandbox
         */
        private String receipt_type;
        /**
         *
         */
        private Long adam_id;
        /**
         * 由应用商店连接生成，并由应用商店用于唯一标识购买的应用。应用程序仅在生产中分配此标识符。将此值视为64位长整数。
         */
        private Long app_item_id;
        /**
         * 收据所属应用程序的捆绑标识符。你在应用商店连接上提供此字符串。这对应于应用程序Info.plist文件中CFBundleIdentifier的值。
         */
        private String bundle_id;
        /**
         * app版本
         */
        private String application_version;
        /**
         *
         */
        private Long download_id;
        /**
         * 标识应用程序修订的任意数字。在沙盒中，这个键的值是“0”。
         */
        private Long version_external_identifier;
        /**
         * 应用程序商店生成收据的时间
         */
        private String receipt_creation_date;
        /**
         * 应用程序商店以UNIX epoch时间格式生成收据的时间（毫秒）
         */
        private String receipt_creation_date_ms;
        /**
         * 应用商店在太平洋时区生成收据的时间。
         */
        private String receipt_creation_date_pst;

        private String request_date;
        private String request_date_ms;
        private String request_date_pst;

        /**
         * 原始应用程序购买的时间，采用类似于ISO 8601的日期时间格式
         */
        private String original_purchase_date;
        private String original_purchase_date_ms;
        private String original_purchase_date_pst;
        /**
         * 用户最初购买的应用程序版本。此值不会更改，并且与原始购买的Info.plist文件中cfbundlesshortversionstring（在iOS中）或cfbundlesshortversionstring（在macOS中）的值相对应。在沙盒环境中，该值始终为“1.0”。
         */
        private String original_application_version;
        private List<AppData> in_app;

        public List<AppData> getIn_app() {
            if (!CollectionUtils.isEmpty(in_app)) {
                in_app.sort(Comparator.comparing(AppleVerifyReceiptResponse.AppData::getPurchase_date_ms).reversed());
            }
            return in_app;
        }
    }

    @Data
    public static class AppData {
        /**
         * 购买的商品数量
         */
        private String quantity;
        /**
         * 商品id
         */
        private String product_id;
        private String transaction_id;
        /**
         * 原始采购的事务标识符
         */
        private String original_transaction_id;
        /**
         * 应用商店向用户帐户收取购买或还原产品费用的时间
         */
        private String purchase_date;
        private String purchase_date_ms;
        private String purchase_date_pst;
        /**
         * 原始应用程序购买的时间，采用类似于ISO 8601的日期时间格式
         */
        private String original_purchase_date;
        private String original_purchase_date_ms;
        private String original_purchase_date_pst;
        /**
         * 指示订阅是否处于免费试用期
         */
        private String is_trial_period;
        /**
         * 退款时间
         */
        private String cancellation_date;
        private String cancellation_date_ms;
        private String cancellation_date_pst;

        /**
         * 退款交易的原因。当客户取消交易时，App Store会给他们退款并提供此密钥的值。
         * 值“1”表示客户因应用程序中的实际或感知问题而取消了交易。值“0”表示交易因其他原因被取消；例如，如果客户是意外购买的
         */
        private String cancellation_reason;

    }

    public enum Status {

        SUCCESS(0, "成功！"),
        REQUEST_ERROR(21000, "对App Store的请求不是使用HTTP POST请求方法发出的。"),
        NO_REQUEST(21001, "此状态代码不再由App Store发送。"),
        RETRY(21002,"receipt-data属性中的数据格式不正确或服务遇到临时问题。再试一次。"),
        NO_AUTH(21003,"这张收据不能被认证"),
        NO_MATCH(21004,"提供的共享秘密与您的帐户文件上的共享秘密不匹配"),
        AGAIN(21005,"收据服务器暂时无法提供收据。再试一次。"),
        NO_VALID(21006,"此收据有效，但订阅已过期。当此状态码返回到您的服务器时，接收数据也将被解码并作为响应的一部分返回。只返回iOS 6风格的自动更新订阅的交易收据"),
        IS_TEST_ERROR(21007,"这个收据来自测试环境，但是它被发送到生产环境进行验证"),
        NO_PROD_ERROR(21008,"这个收据来自生产环境，但是它被发送到测试环境进行验证"),
        UN_ERROR(21009,"内部数据访问错误。稍后再试"),
        NO_EXIST(21010,"用户帐户无法找到或已被删除"),
        ;
        public Integer code;
        public String msg;

        Status(Integer code,String msg) {
            this.code = code;
            this.msg = msg;
        }
        public static String by(Integer code){
            for (Status val:Status.values()
            ) {
                if(val.code.equals(code)){
                    return val.msg;
                }
            }
            return "未知错误！位置code码";
        }
    }

}
